"""
字典性质
    存储多类型数据（key不可以是字典,key必须是不可变类型（字符串，数字，元组），value 可以是任意类型）
    key不可重复（重复就会覆盖），无索引，可修改，for循环
"""
import json

# 1.定义  3
dict1 = {"name1": "马嘉璐", "name2": "巫明瑾", "name3": "巫鑫"}
dict2 = {"马嘉璐": {"语文": 99, "数学": 100, "英语": 100}, "巫明瑾": {"语文": 100, "数学": 100, "英语": 100},
         "巫鑫": {"语文": 60, "数学": 60, "英语": 60}}
dict_empyt1 = dict(a=1,b=2)
dict_empyt2 = {}

# 2. 增 4 (key不存在就是新增; update 或| 两个字典合并 ，setdefault)
info = {"name": "小红", "age": 18}
info["gender"] = "女"
# print(info)  # {'name': '小红', 'age': 18, 'gender': '女'}

info.update(dict_empyt1)
print(info)  # {'name': '小红', 'age': 18, 'gender': '女', 'a': 1, 'b': 2}

# print(info | dict_empyt1) # 临时合并，info没有修改值：{'name': '小红', 'age': 18, 'gender': '女', 'a': 1, 'b': 2}
# print(info)  

#用法 setdefault(key,default=None)
info.setdefault("name",2)
print(info) # 存在的key，正常返回值 {'name': '小红', 'age': 18}
info.setdefault("c",2)
print(info) # 不存在的key，新增 {'name': '小红', 'age': 18, 'gender': '女', 'a': 1, 'b': 2, 'c': 2}

# 3.删 3 （del,pop,clear()）
# 区别：del 指定键删除；,clear() 删除字典；
info1 = {"name": "小红", "age": 18,"gender":"女"}
del info1["name"]
print(info1)  # {'age': 18}

info2={'A':1,'B':2,'C':3}
print("*"*200)
info2.pop('B') 
print(info2)   

info1.popitem() #随机删除一个键值对
info1.pop("age")
print(info1)  # {'age': 18}

info1.clear()
print(info1)  # {}

# 4.改 1 根据key查询后赋值
info1["name"] = "明明"
print(info1)  # {'name': '小明', 'age': 18}

# 5.查 3 (根据key 或者get 或者 in / not in)
print(info["name"])     # 小红
print(info.get("name"))  # 小红
print("name" in info)  # True
print("小红" in info)   # False

# 6.返回所有的keys / values/ items
print(info.keys())  # dict_keys(['name', 'age'])
print(type(info.keys()))  # <class 'dict_keys'>
print(info.values())    # dict_values(['小红', 18])
print(info.items()) # dict_items([('name', '小红'), ('age', 18)])

# 7.键值对的个数 len
print(len(info))    # 2

# 8. 排序（排序的结果都是列表；字典按照key进行排序，value丢失；）
dict1 = {"name1": "马嘉璐", "name2": "巫明瑾", "name3": "巫鑫"}
print(sorted(dict1,reverse=True))  # ['name3', 'name2', 'name1']

# 9.循环

"""转字典"""

# （1）列表转字典 3 （set/zip/索引作为键enumerate-高级用法）
lst = [('a',1),('b',2)]
print(dict(lst)) # 列表元素是键值对

keys = ['a','b']
values = [1,2]
print(dict(zip(keys,values)))  # 两个列表分别是键和值

lst2 = ['a','b','c']
print({i:v for i,v in enumerate(lst2)}) #重要！！ 索引作为键 {0: 'a', 1: 'b', 2: 'c'}
print({k:len(k)for k  in lst2})         # {'a': 1, 'b': 1, 'c': 1}


# （2）字符串转字典 3 (eval函数,json.loads,手动拆分键值对)
    # eval函数(注意安全风险)
s = "{'a':1,'b':2}"
print(eval(s))

    # json.loads
s2 = '{"a":1,"b":2}'
d = json.loads(s2)
print(d)

#     #手动拆分键值对
s1 = "a:1,b:2"
d_dict2 = {}

for i in s1.split(","):
    key,value = i.split(":")
    d_dict2[key] = int(value)
print(d_dict2)

# （3）元组转字典
tp1 = (("a",1),("b",2))
print(dict(tp1))    # {'a': 1, 'b': 2}

# （4）集合转字典
se = {("a",1),("b",2)}
print(dict(se)) # {'a': 1, 'b': 2}


